package com.edu.test;

import com.edu.bean.User;
import org.junit.Test;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class MyTest04 {


    /**
     *  Method 对象 代表了 class文件中 一条方法的信息
     *      获取Method的对象的4种方式.
     *          getMethods()  获取所有的公有方法 和从父类继承到方法
     */
    @Test
    public void test01(){
        Class clazz = User.class; //获取 Class对象

//        Method[] methods =  clazz.getMethods();
//
//        for (Method method : methods) {
//            System.out.println(method.getName());
//        }

//        Method[] methods = clazz.getDeclaredMethods();
////        System.out.println(methods.length);
//        for (Method method : methods) {
//            System.out.println(method.getName());
//        }
//        try {
//            Method m1 =  clazz.getMethod("innerMethod");
//            System.out.println(m1.getName());
//        } catch (NoSuchMethodException e) {
//            e.printStackTrace();
//        }


        try {
            Method m1 =  clazz.getDeclaredMethod("innerMethod");
            System.out.println(m1.getName());
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }
    }

    /**
     *  Method对象的 一些 get方法
     *      用于获取这个方法的一些信息。
     */
    @Test
    public void test02(){
        Class clazz = User.class;
        try {
            Method m = clazz.getMethod("sayHi",int.class,String.class);
            System.out.println("方法名字:"+m.getName());
            System.out.println("方法定义在哪个类里:"+m.getDeclaringClass());
            System.out.println("方法的参数个数:"+m.getParameterCount());
            System.out.println("方法的参数类型:"+m.getParameterTypes());
            for (Class type : m.getParameterTypes()) {
                System.out.println(type.getName());
            }
            System.out.println("方法的返回值类型"+m.getReturnType());
            System.out.println("方法的异常类型"+m.getExceptionTypes().length);
            System.out.println("方法的修饰符"+m.getModifiers());
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }
    }

    /**
     * Method 通过反射调用一个方法
     */
    @Test
    public void test03(){
        User user = new User();
        user.setUsername("张三");
        User user2 = new User();
        user2.setUsername("李四");
        Class clazz = User.class;
        try {
            Method sayHi = clazz.getDeclaredMethod("makeNum");
            sayHi.setAccessible(true);
            Object o = sayHi.invoke(user);
            System.out.println(o);

        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }
}
